{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对结构化数据进行分类\n",
    "\n",
    "* 用 Pandas 导入 CSV 文件。\n",
    "* 用 tf.data 建立了一个输入流水线（pipeline），用于对行进行分批（batch）和随机排序（shuffle）。\n",
    "* 用特征列将 CSV 中的列映射到用于训练模型的特征。\n",
    "* 用 Keras 构建，训练并评估模型。"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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Fjh5YtU15X2tmi5RTfYhcpVUz8xVLmQbFbrllMVVzp50zwJ1D4cP1W5cTykvInKzsyfhsP+9/9G3Gt7cureraiBzzbJI+z3cw1u8VZqY6fw5j+O5n2t1iMMngO4XeI7HXc8hq9XgYcK6Ib/2ylPev8C7pVkueYZTLHDy0D12FllpeMAdz/Du+V/j5KFDnHQ9GHr/oz4Wvh7mgfOtzgyZG6QsutJWw16zgeJKi33naafXbj+PfbWLhd9t/Iic+pRFyu+hRoFr62Pr6+vrXiv+n4v/706fi4iIiIiIyK7yb/f+zIbrf2KHzkNERERERERqKCATERERERFpEgVkIiIiIiIiTaKATEREREREpEkUkImIiIiIiDSJAjIREREREZEmUUAmIiIiIiLSJArIREREREREmkQBmYiIiIiISJMoIBMREREREWkSBWQiIiIiIiJNooBMRERERESkSRSQiYiIiIiINIkCMhERERERkSZRQCYiIiIiItIkCshERERERESaRAGZiIiIiIhIk9zSaMXa2n/fyfMQERERERHZdf7t3p/ZcP3H1tfX13foXERERERERMRFKYsiIiIiIiJNooBMRERERESkSRSQiYiIiIiINIkCMhERERERkSZRQCYiIiIiItIkCshERERERESaRAGZiIiIiIhIkyggExERERERaRIFZCIiIiIiIk2igExkN8om8A3Obrw+ksYqvS6kibQlMDc86CxD7n0okoxESRZcmxTSRNzvW0gTaQvi8/qJpLHc73u5c27AHAzic45hDrrOp3wuRZKRIEPZKz70ZVmTifL7WYWia3mUyGTltTlY//7mYHBLn1dEdoC7jMwmymWMtyLJSPX6+r/52vJTbgbWZHST5fwsQ21e9VSj5Rsd53J1uVyPbtnqjuZgkL6ZRmt7mVoexdjqwUXkMmYZahtgumZpR9wkc9zfeLdCmohhEUtWL7ZyOYhf5m82a2ExxpG2HMPmNLH22vUJfLEZOnpTWEAAoL2fzHI/5mAQM7zEeI9ddiQDznkW0pv8vN6sySh9pFhZ7rYXDISJGAkCywamkcMw+6GQxsz3EuvZ1lt5KGIBphFkxHO9gW/M9XImaH9fvSlWJroxJkyGIwZDWfv/i4hcJwppIrEiw+aoXY71jDLVG6Rv0GBlottj+yIWM4y0zRBNevw9F9JEjDEWQ3FiO3D6cv0I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Hcfuh3OvslhbR5eGCjRYjh4Mvetc84DM+vrdPPTenUyN3EfHLReY/t27GSrep8JIRERERERuete+h+yjC0w/neA/fed9Lv7LHvYeuItnXjyJsfeavquIiIiIiMh1b2dSFkVERERERKTO1mdZFBERERERkW1RQCYiIiIiItIkCshERERERESaRAGZiIiIiIhIkyggExERERERaRIFZCIiIiIiIk2igExERERERKRJFJCJiIiIiIg0iQIyERERERGRJlFAJiIiIiIi0iS3NFqxVPyHnTwPERERERGRXSfo/9SG6z+2vr6+vkPnIiIiIiIiIi5KWRQREREREWkSBWQiIiIiIiJNooBMRERERESkSRSQiYiIiIiINIkCMhERERERkSZRQCYiIiIiItIkCshERERERESaRAGZiIiIiIhIkyggExERERERaZIbPCCbZagtSrLQ7PMQuR7MMtQWZCi7iU2zCXyRNFbpdSFNpC2BeZndzMEgkclizdIiycgm37f0Xu739mBNRvG1Ba/gx10O2Odz2X0GZxt+Rl/t/8dNnLOI7CLuMjKbwLdh+VgkGalebw7WlomzDKkMuelYk9GGdU21RvX3FdTr5e0vX5fL9eeWre9aJBkxGMm7FrXs5WDPk4w/08ut2zjylv3zBd77ixzmf8nxx38V4Jm/OY3RhNMQudasyShHxvLeK2NBpusWhhg2p4mRJmJYxJI1x8vlID56mb+XWcyZEIbpr15cyGESZ7xnkyff3k/MH2RoMkzmuN9zk8DxaVaOuxZkE/hyBisT3dgVToqAOU2svdGbOJ+3wXprMsoR152RORikb8b+dzS5xMrEJj+LiOw+hTSRWJFhc5QAQM8oU71B+gZLZVDt9kUsZhhpmyGaXKovCwtpIsYYi6E4sR04fbl+BI6PMhwxiEyaDes7AHNwwK633fV3KM6wf6x+OZSvM3fd5TbdVrOwN+V97cp1Y9thU0fcucg+usTF//ttHn8gwVDrAb716L6rcX5XoEjynijf/Jk7uXsfXFz7Hzv8/iI7bNMFrB3AAGBZLIYCBKraaWdJjuVZxMA3VruvE9hYCXwxp4A3gowAhOLMZfqxUmMs5uFIm3vnXqaWGwd4xkCcZCKHdbzfvuGp49Hgwww+dx1TOg9c5dAWGRN2EGYOBtWyKHIzyybwxYp1DTrGhMlwxMAXscu9qnKr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ERERERG5WSkgExERERERaRIFZCIiIiIiIk2igExERERERKRJFJCJiIiIiIg0iQIyERERERGRJlFAJiIiIiIi0iQKyERERERERJpEAZmIiIiIiEiTKCATERERERFpEgVkIiIiIiIiTaKATEREREREpEluabRiqfgPO3keIiIiIiIiu07Q/6kN139sfX19fYfORURERERERFyUsigiIiIiItIkCshERERERESaRAGZiIiIiIhIkyggExERERERaRIFZCIiIiIiIk2igExERERERKRJFJCJiIiIiIg0iQIyERERERGRJlFAJiIiIiIi0iRNDshmGWoLMpRt7lmI7A5X8PeUTeCLpLFKrwtpIm0JzMvsZg4GiUwWa5YWSUYu876FNJG2KMlC9bn6vH4GZz32vfy5iYhcNe4yMpvAt2EZVCQZqV5vDtaWibMMuctcuSlYk9H6Os1To/r7Su+TZxlSfXlDumW7B7j4F2keP3WG+eIa/GQLgc6HOfXVfj7701fj9DbhowtMP53gP33nfS7+C7T4O4mNJnnkF/fs0AmI7DxrMsqRsbz3yliQ6bqFIYbNaWKkiRgWsWTN8XI5iI9ibPius5gzIQzTX724kMMkznhP/R7mYJC+mcrrRSPICEAoztzyEuPONsmASea4v/4AzDJkjLEI9LXNVK8KxZnL9BPY6JRVPojIlSqkicSKDJujdvnSM8pUb5C+QYOViW6P7YtYzDDSNkM0uVRfFhbSRIwxFkNxYjtw+nL9CBwfZThiEJlsVMfZzMEBu95219+hOMP+sfrlUL7OauvYkuna+rI35X3tynVjWwHZWu4En+tb4LZnX+Mvf8NPy78UeeupL/OlByDzrX46th3uXfYMME/czdAHd/Ky+RpdP7fG9/7gy3zpgVMEzp+m65q/v0gTbbqAnWWoLWX/07JYDAUIVLXTzpIcy7OIgW+sdl8nkLMS+GJOAe8OqjL9WKkxFvNwpM29cy9Ty6MYE0vMBaIcsQbscy04AWE5kGoQ5AF2q3OKgLnESnvt5xnACoc3DsZUPojIlcom8MWKdrnnKneMCZPhiIEv4tEQ1N7NeGaJ8WwCX26W8Z7qctlMjUHcZGWDG3K58TUKjgDIe9SvTh3KZJS+Ypy55X6swSBm2Anqswl8MbsuDUxGGWLUM6irbgSYZajNxFh2NbBmE/hyV+MTyrW0jZTF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R9e49GR6nbzstfTw8L85wZ7Zcb7w9TIrwErxIoM/9xAX3tzA7h/r59FdLzL21ctc/dEKy391kbGLdU31vfvYxzWuLa2w8qObFUSKbB92uQxeww14KrM61eexm5MloraJp24m1HVVX5a6f4jcooWRafMS6oUCVjGEWTmeMZxlKWDVXrJqxXx4TJvoom48IrI9WLEI2VCktVHKttfsAQFWp81PZslZBqnmOlGk3v4hci2ZIV6iuTREN3DtFMc50uvDU/uJkGWGwYZl62SnyLZw6/qLBs7yzF88wmDwfs7/wz08cPwQh1n/imiZJKQ6CPbQGb49DZ/7Upj3fXEFevw8/BtpTt27gbLsOsS53zvDZyJRfvZr7rT3j37US604uz7KQ5/Zy+Dg/Tz/i2mWvqKX58lOUsYqFAkP9Te8BN29Abivo8hC5V1i1M0e1qHHaibiTurhd9/y8oLAAAAgAElEQVSb4m5THchceal00f3emoUC86FImxbi1bFuffF260VEbrfViRfmcq3PAVZhBvzxtvXiahp5/bT5Q+QWDbdORWN47l5+jBtO/+hnYp0ZP9unN2pSjzvVPY7jON0uxG3RlN742pOH+eT/eUJvLpcdpeOLKf1x5nIBrEoaRLRc//DQpuKuy4evn7inNjX0hr43ZVLBBCSTkKhroWuaibV5PJxeNi8it13duxVX65+6BiugdZbEurGx646BbZ2JUXauhvvahsZHdx77Vbt3bvo4cie4OwKyH13m8X89Ts9/TDN6aC98b5xP/tJFjMlLTAzoRc8iIiIiItIdd0dABiy/kmHkS09zqbwMPV4ODyWZ/nd+dne7YCIiIiIicte6awIyERERERGR7eaWzbIoIiIiIiIia1NAJiIiIiIi0iUKyERERERERLpEAZmIiIiIiEiXKCATERERERHpEgVkIiIiIiIiXaKATEREREREpEsUkImIiIiIiHSJAjIREREREZEuUUAmIiIiIiLSJbs6rSiV37yd5RAREREREdlxfN5711x/j+M4zm0qi4iIiIiIiNRRyqKIiIiIiEiXKCATERERERHpEgVkIiIiIiIiXaKATEREREREpEsUkImIiIiIiHSJAjIREREREZEuUUAmIiIiIiLSJQrIREREREREukQBmYiIiIiISJfcmQHZ29e48q1XuPp2twsCUCYV9DGS73Y5RGYZ6d3g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raQdVl8WHWp6GXsZu+zHaNvZ1c9EpWfMM+5t2M8ul6F5co+yjU3/Ov1mbuuyEammR4aYrhsAb8XW2LWQwJOuH7ehHjIRuV1WJ16Yy7U2TFmFGfDH29Z/jfVvtlKPDpFbNNwGKTSG5+7V6f67lv7K7MhraJveqEk97lT3OI7jdLsQInJjGl+WXJ+eSPspd5sn46hNrzuE0fzvWq9Tc2C3wVkPqU7r236cxOqDS3urDy1tcuYBmqYV1kOOiGxZpe5rrLua67zmBqK6uqhlLE+z1pkYZedquM+te23AWmO/avfzTR9H7gQKyERERERERLpk02PIREREREREZGsUkImIiIiIiHSJAjIREREREZEuUUAmIiIiIiLSJQrIREREREREukQBmYiIiIiISJcoIBMREREREekSBWQiIiIiIiJdooBMRERERESkSxSQiYiIiIiIdIkCMhERERERkS5RQCYiIiIiItIluzqtKJXfvJ3lEBERERER2XF83nvXXH+P4zjObSqLiIiIiIiI1FHKooiIiIiISJcoIBMREREREekSBWQiIiIiIiJdooBMRERERESkSxSQiYiIiIiIdIkCMhERERERkS5RQCYiIiIiItIlCshERERERES6RAGZiIiIiIhIl2zzgGyWkV4fI/m11odJLdzOMolsH/ZUmOBUuc2aG/xu5BN4NrR9mVSwebsyqaCPkbz7X09strbGijVua8V8eHo7/7T/LCIit1k+gSeYwa7+uzeB1XHjMqlg43or1vzsMstI9Xhy17Cnwg33xM46Pe+u9xzcbvu1rlXZrrYQkLkPX+0eoOyp8GpFdjMtZAgqABOpKGMVihh2ejWoic1Wgp4IWYqMmavLq+ypcGswFJ2B+u03FSR5ieZKzBnp2vnMSADLbLw5hFMllhZbf6ZDN+0PIyKyeQsZgtEyo8khDICBJNOhGQY7PVgvlLGZYbDTg/NChmBvhOwtLLJsT8ZwktFyZN37qBVzr49stO7+G8yQare87jprbeSMkK1ciw3LNxQUSjft6nYBRGSTFgpYxRDRXJKJyQipoIkd6MccKLE0OctIbxrDymIWwhxpah3pi1vkhr11S1a3j+5vPZUV8zFImqVJb+tKAPwYhvsvYzjLUnXx/iEm4mGOBDPM5Ya29nlFRG61fAJPtMxoU11oTlqMBk08wThzuUqgVrW/n4lciYl8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vWZ23CJX14JXe1dPzH1nmVWA0WR/3T7uoOa5XPvJP6rplCIit9/adZRVmAF/vG0VtTr9ff20+UPkFg13RkY0hufutfqezo3rZ2KdGT/bpzdqUo871T2O4zjdLoSIbEI+gadgMFoexwq4qYet78SpE/oio+VvuuPN0pUpniN2Xd57aPWdJ3WzhjVOAOLOsmh7IUvrVPrU7Vstk6vz1PiNY9k0C5mIdEHenSChsb5z663VcWDN9VPd7IotY3matc7EKDtXw7143WsD1hr7VZs1edPHkTuBAjIREREREZEu+QfdLoCIiIiIiMjdSgGZiIiIiIhIlyggExERERER6RIFZCIiIiIiIl2igExERERERKRLFJCJiIiIiIh0iQIyERERERGRLlFAJiIiIiIi0iUKyERERERERLpEAZmIiIiIiEiXKCATERERERHpEgVkIiIiIiIiXbKr04pS+c3bWQ4REREREZEdx+e9d8319ziO49ymsoiIiIiIiEgdpSyKiIiIiIh0iQIyERERERGRLlFAJiIiIiIi0iUKyERERERERLpEAZmIiIiIiEiXKCATERERERHpEgVkIiIiIiIiXaKATEREREREpEsUkImIiIiIiHSJAjKRO5gV8+HpTWAB5BN4en2df2KzDfvaU2E8vWFSC3UL84nWZe3kE3iCGWwAyqSCG9hHRGS7WsgQrNZp+UStvrRiPkbyALOMVOvaTvu3rC+TClb3l7tH+//v9lS45T4M9ddY3b207nq0p8IEp8q3odzSTfc4juNsbtcyqaDJWLF1TThVYmJgawUTkXUsZAgmIBooMFgIMJcbwqitLJMKJiCZJbq/fqdZRnojZDd6jlCapcl+9wElOrPxslX3ExG5U+QTeAomSwELT8FkmghWoPI8s5AhmDbIdajX7KkwR+wAo+Xxts9F9friFrlh780vv3TRWvfWENOLEey292RYvV8nIZGAoQBWBiYq93QrFsaOtNtPdpItB2RWQBWLSDdYMV/tYcGK+UgZdd/FSrA20RCkdTLLSG8aw7qBCr/64DLZT3Pw5z6YRBSQicgdw576/9u7+9i2zvte4N/iGhCwYCoyXAcrIKMieagOlJfGStsLB2trL5V4JpHmbTM7vamdLo2zViJlkdTa2NkaJ22XeF1FSuaL0GZJG8e9a2x0LUNaPpTbyhs6597t2m63kJjFQ7Kp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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集\n",
    "下面是该数据集的描述。 请注意，有数值（numeric）和类别（categorical）类型的列。  \n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入库\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import feature_column\n",
    "from tensorflow.keras import layers\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 Pandas 创建一个 dataframe\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip\n",
      "1671168/1668792 [==============================] - 1s 1us/step\n"
     ]
    }
   ],
   "source": [
    "import pathlib\n",
    "\n",
    "dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'\n",
    "csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'\n",
    "\n",
    "tf.keras.utils.get_file('petfinder_mini.zip', dataset_url,\n",
    "                        extract=True, cache_dir='.')\n",
    "dataframe = pd.read_csv(csv_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Type</th>\n",
       "      <th>Age</th>\n",
       "      <th>Breed1</th>\n",
       "      <th>Gender</th>\n",
       "      <th>Color1</th>\n",
       "      <th>Color2</th>\n",
       "      <th>MaturitySize</th>\n",
       "      <th>FurLength</th>\n",
       "      <th>Vaccinated</th>\n",
       "      <th>Sterilized</th>\n",
       "      <th>Health</th>\n",
       "      <th>Fee</th>\n",
       "      <th>Description</th>\n",
       "      <th>PhotoAmt</th>\n",
       "      <th>AdoptionSpeed</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Cat</td>\n",
       "      <td>3</td>\n",
       "      <td>Tabby</td>\n",
       "      <td>Male</td>\n",
       "      <td>Black</td>\n",
       "      <td>White</td>\n",
       "      <td>Small</td>\n",
       "      <td>Short</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Healthy</td>\n",
       "      <td>100</td>\n",
       "      <td>Nibble is a 3+ month old ball of cuteness. He ...</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Cat</td>\n",
       "      <td>1</td>\n",
       "      <td>Domestic Medium Hair</td>\n",
       "      <td>Male</td>\n",
       "      <td>Black</td>\n",
       "      <td>Brown</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Not Sure</td>\n",
       "      <td>Not Sure</td>\n",
       "      <td>Healthy</td>\n",
       "      <td>0</td>\n",
       "      <td>I just found it alone yesterday near my apartm...</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Dog</td>\n",
       "      <td>1</td>\n",
       "      <td>Mixed Breed</td>\n",
       "      <td>Male</td>\n",
       "      <td>Brown</td>\n",
       "      <td>White</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Healthy</td>\n",
       "      <td>0</td>\n",
       "      <td>Their pregnant mother was dumped by her irresp...</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Dog</td>\n",
       "      <td>4</td>\n",
       "      <td>Mixed Breed</td>\n",
       "      <td>Female</td>\n",
       "      <td>Black</td>\n",
       "      <td>Brown</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Short</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Healthy</td>\n",
       "      <td>150</td>\n",
       "      <td>Good guard dog, very alert, active, obedience ...</td>\n",
       "      <td>8</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Dog</td>\n",
       "      <td>1</td>\n",
       "      <td>Mixed Breed</td>\n",
       "      <td>Male</td>\n",
       "      <td>Black</td>\n",
       "      <td>No Color</td>\n",
       "      <td>Medium</td>\n",
       "      <td>Short</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Healthy</td>\n",
       "      <td>0</td>\n",
       "      <td>This handsome yet cute boy is up for adoption....</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Type  Age                Breed1  Gender Color1    Color2 MaturitySize  \\\n",
       "0  Cat    3                 Tabby    Male  Black     White        Small   \n",
       "1  Cat    1  Domestic Medium Hair    Male  Black     Brown       Medium   \n",
       "2  Dog    1           Mixed Breed    Male  Brown     White       Medium   \n",
       "3  Dog    4           Mixed Breed  Female  Black     Brown       Medium   \n",
       "4  Dog    1           Mixed Breed    Male  Black  No Color       Medium   \n",
       "\n",
       "  FurLength Vaccinated Sterilized   Health  Fee  \\\n",
       "0     Short         No         No  Healthy  100   \n",
       "1    Medium   Not Sure   Not Sure  Healthy    0   \n",
       "2    Medium        Yes         No  Healthy    0   \n",
       "3     Short        Yes         No  Healthy  150   \n",
       "4     Short         No         No  Healthy    0   \n",
       "\n",
       "                                         Description  PhotoAmt  AdoptionSpeed  \n",
       "0  Nibble is a 3+ month old ball of cuteness. He ...         1              2  \n",
       "1  I just found it alone yesterday near my apartm...         2              0  \n",
       "2  Their pregnant mother was dumped by her irresp...         7              3  \n",
       "3  Good guard dog, very alert, active, obedience ...         8              2  \n",
       "4  This handsome yet cute boy is up for adoption....         3              2  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看前5个数据\n",
    "dataframe.head()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 创建目标变量\n",
    "原始数据集中的任务是预测宠物被领养的速度（例如，在第一周、第一个月、前三个月等）。我们针对教程进行一下简化。在这里，我们将把它转化为一个二元分类问题，并简单地预测宠物是否被领养。\n",
    "\n",
    "修改标签列后，0 表示宠物未被领养，1 表示宠物已被领养。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 在原始数据集中，“4”表示该宠物未被收养\n",
    "dataframe['target'] = np.where(dataframe['AdoptionSpeed']==4, 0, 1)\n",
    "\n",
    "# 删除未使用的列\n",
    "dataframe = dataframe.drop(columns=['AdoptionSpeed', 'Description'])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 将 dataframe 拆分为训练、验证和测试集\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7383 train examples\n",
      "1846 validation examples\n",
      "2308 test examples\n"
     ]
    }
   ],
   "source": [
    "train, test = train_test_split(dataframe, test_size=0.2)\n",
    "train, val = train_test_split(train, test_size=0.2)\n",
    "print(len(train), 'train examples')\n",
    "print(len(val), 'validation examples')\n",
    "print(len(test), 'test examples')"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 用 tf.data 创建输入流水线\n",
    "接下来，我们将使用 tf.data 包装 dataframe。这让我们能将特征列作为一座桥梁，该桥梁将 Pandas dataframe 中的列映射到用于训练模型的特征。如果我们使用一个非常大的 CSV 文件（非常大以至于它不能放入内存），我们将使用 tf.data 直接从磁盘读取它。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建tf的实用程序方法。从Pandas Dataframe获取数据集\n",
    "def df_to_dataset(dataframe, shuffle=True, batch_size=32):\n",
    "  dataframe = dataframe.copy()\n",
    "  labels = dataframe.pop('target')\n",
    "  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))\n",
    "  if shuffle:\n",
    "    ds = ds.shuffle(buffer_size=len(dataframe))\n",
    "  ds = ds.batch(batch_size)\n",
    "  return ds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 5 # 小批量用于演示目的\n",
    "train_ds = df_to_dataset(train, batch_size=batch_size)\n",
    "val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)\n",
    "test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 理解输入流水线\n",
    "已经创建了输入流水线，让我们调用它来查看它返回的数据的格式。 我们使用了一小批量大小来保持输出的可读性。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Every feature: ['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt']\n",
      "A batch of ages: tf.Tensor([ 8  6 12  2  1], shape=(5,), dtype=int64)\n",
      "A batch of targets: tf.Tensor([0 1 1 1 1], shape=(5,), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "for feature_batch, label_batch in train_ds.take(1):\n",
    "  print('Every feature:', list(feature_batch.keys()))\n",
    "  print('A batch of ages:', feature_batch['Age'])\n",
    "  print('A batch of targets:', label_batch )"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以看到数据集返回了一个字典，该字典从列名称（来自 dataframe）映射到 dataframe 中行的列值。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 演示几种特征列\n",
    "TensorFlow 提供了多种特征列。本节中，我们将创建几类特征列，并演示特征列如何转换 dataframe 中的列。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Type': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Dog', b'Cat', b'Dog', b'Dog', b'Cat'], dtype=object)>,\n",
       " 'Age': <tf.Tensor: shape=(5,), dtype=int64, numpy=array([11,  2,  2, 48,  1], dtype=int64)>,\n",
       " 'Breed1': <tf.Tensor: shape=(5,), dtype=string, numpy=\n",
       " array([b'Beagle', b'Tortoiseshell', b'Mixed Breed', b'Poodle',\n",
       "        b'Domestic Short Hair'], dtype=object)>,\n",
       " 'Gender': <tf.Tensor: shape=(5,), dtype=string, numpy=\n",
       " array([b'Female', b'Female', b'Female', b'Female', b'Female'],\n",
       "       dtype=object)>,\n",
       " 'Color1': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Black', b'Brown', b'Brown', b'Cream', b'Black'], dtype=object)>,\n",
       " 'Color2': <tf.Tensor: shape=(5,), dtype=string, numpy=\n",
       " array([b'Brown', b'Golden', b'No Color', b'No Color', b'Brown'],\n",
       "       dtype=object)>,\n",
       " 'MaturitySize': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Medium', b'Medium', b'Medium', b'Small', b'Small'], dtype=object)>,\n",
       " 'FurLength': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Short', b'Medium', b'Medium', b'Medium', b'Short'], dtype=object)>,\n",
       " 'Vaccinated': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Yes', b'Yes', b'No', b'Yes', b'No'], dtype=object)>,\n",
       " 'Sterilized': <tf.Tensor: shape=(5,), dtype=string, numpy=array([b'Not Sure', b'No', b'No', b'Yes', b'No'], dtype=object)>,\n",
       " 'Health': <tf.Tensor: shape=(5,), dtype=string, numpy=\n",
       " array([b'Healthy', b'Healthy', b'Healthy', b'Healthy', b'Healthy'],\n",
       "       dtype=object)>,\n",
       " 'Fee': <tf.Tensor: shape=(5,), dtype=int64, numpy=array([  0,   0,   0, 250,   0], dtype=int64)>,\n",
       " 'PhotoAmt': <tf.Tensor: shape=(5,), dtype=int64, numpy=array([ 2, 11,  5,  4,  1], dtype=int64)>}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 我们将使用这个批来演示几种类型的特性列\n",
    "example_batch = next(iter(train_ds))[0]\n",
    "example_batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建特性列的实用程序方法\n",
    "# 并对一批数据进行转换\n",
    "def demo(feature_column):\n",
    "  feature_layer = layers.DenseFeatures(feature_column)\n",
    "  print(feature_layer(example_batch).numpy())"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数值列\n",
    "一个特征列的输出将成为模型的输入（使用上面定义的 demo 函数，我们将能准确地看到 dataframe 中的每列的转换方式）。 数值列（numeric column） 是最简单的列类型。它用于表示实数特征。使用此列时，模型将从 dataframe 中接收未更改的列值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 2.]\n",
      " [11.]\n",
      " [ 5.]\n",
      " [ 4.]\n",
      " [ 1.]]\n"
     ]
    }
   ],
   "source": [
    "photo_count = feature_column.numeric_column('PhotoAmt')\n",
    "demo(photo_count)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分桶列\n",
    "通常，您不希望将数字直接输入模型，而是根据数值范围将其值分成不同的类别。考虑代表一个人年龄的原始数据。我们可以用 分桶列（bucketized column）将年龄分成几个分桶（buckets），而不是将年龄表示成数值列。请注意下面的 one-hot 数值表示每行匹配的年龄范围。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0. 0. 1.]\n",
      " [0. 1. 0. 0.]\n",
      " [0. 1. 0. 0.]\n",
      " [0. 0. 0. 1.]\n",
      " [0. 1. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "age = feature_column.numeric_column('Age')\n",
    "age_buckets = feature_column.bucketized_column(age, boundaries=[1, 3, 5])\n",
    "demo(age_buckets)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分类列\n",
    "在此数据集中，thal 用字符串表示（如 'fixed'，'normal'，或 'reversible'）。我们无法直接将字符串提供给模型。相反，我们必须首先将它们映射到数值。分类词汇列（categorical vocabulary columns）提供了一种用 one-hot 向量表示字符串的方法（就像您在上面看到的年龄分桶一样）。词汇表可以用 categorical_column_with_vocabulary_list 作为 list 传递，或者用 categorical_column_with_vocabulary_file 从文件中加载。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 1.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [1. 0.]]\n"
     ]
    }
   ],
   "source": [
    "animal_type = feature_column.categorical_column_with_vocabulary_list(\n",
    "      'Type', ['Cat', 'Dog'])\n",
    "\n",
    "animal_type_one_hot = feature_column.indicator_column(animal_type)\n",
    "demo(animal_type_one_hot)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 嵌入列\n",
    "假设我们不是只有几个可能的字符串，而是每个类别有数千（或更多）值。 由于多种原因，随着类别数量的增加，使用 one-hot 编码训练神经网络变得不可行。我们可以使用嵌入列来克服此限制。嵌入列（embedding column）将数据表示为一个低维度密集向量，而非多维的 one-hot 向量，该低维度密集向量可以包含任何数，而不仅仅是 0 或 1。嵌入的大小（在下面的示例中为 8）是必须调整的参数。\n",
    "\n",
    "关键点：当分类列具有许多可能的值时，最好使用嵌入列。我们在这里使用嵌入列用于演示目的，为此您有一个完整的示例，以在将来可以修改用于其他数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.61992735  0.43354046 -0.3657211  -0.02217631  0.09094315 -0.14921367\n",
      "   0.20001413 -0.2158108 ]\n",
      " [-0.16103405  0.2293462   0.25379077 -0.21365134 -0.23677778 -0.2737417\n",
      "   0.5228353   0.26123923]\n",
      " [-0.27055305  0.1281035  -0.06410974  0.16623133 -0.1869549  -0.2615515\n",
      "  -0.66646475 -0.20771728]\n",
      " [ 0.14549407  0.29467344  0.23482719  0.51017004  0.522354   -0.1989064\n",
      "  -0.33994097  0.01993669]\n",
      " [ 0.24517111  0.4298316   0.17092457  0.2861499   0.6197846   0.26034796\n",
      "   0.10138234 -0.12795258]]\n"
     ]
    }
   ],
   "source": [
    "# 注意，嵌入列的输入是分类列\n",
    "\n",
    "breed1 = feature_column.categorical_column_with_vocabulary_list(\n",
    "      'Breed1', dataframe.Breed1.unique())\n",
    "breed1_embedding = feature_column.embedding_column(breed1, dimension=8)\n",
    "demo(breed1_embedding)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 经过哈希处理的特征列\n",
    "表示具有大量数值的分类列的另一种方法是使用 categorical_column_with_hash_bucket。该特征列计算输入的一个哈希值，然后选择一个 hash_bucket_size 分桶来编码字符串。使用此列时，您不需要提供词汇表，并且可以选择使 hash_buckets 的数量远远小于实际类别的数量以节省空间。\n",
    "\n",
    "关键点：该技术的一个重要缺点是可能存在冲突，不同的字符串被映射到同一个范围。实际上，无论如何，经过哈希处理的特征列对某些数据集都有效。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]\n"
     ]
    }
   ],
   "source": [
    "breed1_hashed = feature_column.categorical_column_with_hash_bucket(\n",
    "      'Breed1', hash_bucket_size=10)\n",
    "demo(feature_column.indicator_column(breed1_hashed))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 组合的特征列\n",
    "将多种特征组合到一个特征中，称为特征组合（feature crosses），它让模型能够为每种特征组合学习单独的权重。此处，我们将创建一个 age 和 thal 组合的新特征。请注意，crossed_column 不会构建所有可能组合的完整列表（可能非常大）。相反，它由 hashed_column 支持，因此您可以选择表的大小。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "crossed_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=10)\n",
    "demo(feature_column.indicator_column(crossed_feature))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 选择要使用的列\n",
    "已经了解了如何使用几种类型的特征列。 现在我们将使用它们来训练模型。本教程的目标是向您展示使用特征列所需的完整代码（例如，机制）。我们任意地选择了几列来训练我们的模型。\n",
    "\n",
    "关键点：如果您的目标是建立一个准确的模型，请尝试使用您自己的更大的数据集，并仔细考虑哪些特征最有意义，以及如何表示它们。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_columns = []\n",
    "\n",
    "# 数字列\n",
    "for header in ['PhotoAmt', 'Fee', 'Age']:\n",
    "  feature_columns.append(feature_column.numeric_column(header))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分桶列\n",
    "age = feature_column.numeric_column('Age')\n",
    "age_buckets = feature_column.bucketized_column(age, boundaries=[1, 2, 3, 4, 5])\n",
    "feature_columns.append(age_buckets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分类列\n",
    "indicator_column_names = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',\n",
    "                          'FurLength', 'Vaccinated', 'Sterilized', 'Health']\n",
    "for col_name in indicator_column_names:\n",
    "  categorical_column = feature_column.categorical_column_with_vocabulary_list(\n",
    "      col_name, dataframe[col_name].unique())\n",
    "  indicator_column = feature_column.indicator_column(categorical_column)\n",
    "  feature_columns.append(indicator_column)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 嵌入列\n",
    "breed1 = feature_column.categorical_column_with_vocabulary_list(\n",
    "      'Breed1', dataframe.Breed1.unique())\n",
    "breed1_embedding = feature_column.embedding_column(breed1, dimension=8)\n",
    "feature_columns.append(breed1_embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 组合列\n",
    "age_type_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=100)\n",
    "feature_columns.append(feature_column.indicator_column(age_type_feature))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 建立一个新的特征层\n",
    "已经定义了我们的特征列，我们将使用密集特征（DenseFeatures）层将特征列输入到我们的 Keras 模型中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_layer = tf.keras.layers.DenseFeatures(feature_columns)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "之前，我们使用一个小批量大小来演示特征列如何运转。我们将创建一个新的更大批量的输入流水线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "train_ds = df_to_dataset(train, batch_size=batch_size)\n",
    "val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)\n",
    "test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建、编译和训练模型\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'Type': <tf.Tensor 'ExpandDims_11:0' shape=(None, 1) dtype=string>, 'Age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'Breed1': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=string>, 'Gender': <tf.Tensor 'ExpandDims_6:0' shape=(None, 1) dtype=string>, 'Color1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=string>, 'Color2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=string>, 'MaturitySize': <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=string>, 'FurLength': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=string>, 'Vaccinated': <tf.Tensor 'ExpandDims_12:0' shape=(None, 1) dtype=string>, 'Sterilized': <tf.Tensor 'ExpandDims_10:0' shape=(None, 1) dtype=string>, 'Health': <tf.Tensor 'ExpandDims_7:0' shape=(None, 1) dtype=string>, 'Fee': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'PhotoAmt': <tf.Tensor 'ExpandDims_9:0' shape=(None, 1) dtype=int64>}\n",
      "Consider rewriting this model with the Functional API.\n",
      "WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'Type': <tf.Tensor 'ExpandDims_11:0' shape=(None, 1) dtype=string>, 'Age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'Breed1': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=string>, 'Gender': <tf.Tensor 'ExpandDims_6:0' shape=(None, 1) dtype=string>, 'Color1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=string>, 'Color2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=string>, 'MaturitySize': <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=string>, 'FurLength': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=string>, 'Vaccinated': <tf.Tensor 'ExpandDims_12:0' shape=(None, 1) dtype=string>, 'Sterilized': <tf.Tensor 'ExpandDims_10:0' shape=(None, 1) dtype=string>, 'Health': <tf.Tensor 'ExpandDims_7:0' shape=(None, 1) dtype=string>, 'Fee': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'PhotoAmt': <tf.Tensor 'ExpandDims_9:0' shape=(None, 1) dtype=int64>}\n",
      "Consider rewriting this model with the Functional API.\n",
      "231/231 [==============================] - ETA: 0s - loss: 0.6936 - accuracy: 0.6843WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'Type': <tf.Tensor 'ExpandDims_11:0' shape=(None, 1) dtype=string>, 'Age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'Breed1': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=string>, 'Gender': <tf.Tensor 'ExpandDims_6:0' shape=(None, 1) dtype=string>, 'Color1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=string>, 'Color2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=string>, 'MaturitySize': <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=string>, 'FurLength': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=string>, 'Vaccinated': <tf.Tensor 'ExpandDims_12:0' shape=(None, 1) dtype=string>, 'Sterilized': <tf.Tensor 'ExpandDims_10:0' shape=(None, 1) dtype=string>, 'Health': <tf.Tensor 'ExpandDims_7:0' shape=(None, 1) dtype=string>, 'Fee': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'PhotoAmt': <tf.Tensor 'ExpandDims_9:0' shape=(None, 1) dtype=int64>}\n",
      "Consider rewriting this model with the Functional API.\n",
      "231/231 [==============================] - 2s 3ms/step - loss: 0.6936 - accuracy: 0.6843 - val_loss: 0.5505 - val_accuracy: 0.6766\n",
      "Epoch 2/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.5631 - accuracy: 0.7055 - val_loss: 0.5376 - val_accuracy: 0.7161\n",
      "Epoch 3/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.5268 - accuracy: 0.7244 - val_loss: 0.4981 - val_accuracy: 0.7546\n",
      "Epoch 4/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.5043 - accuracy: 0.7283 - val_loss: 0.5079 - val_accuracy: 0.7210\n",
      "Epoch 5/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4948 - accuracy: 0.7317 - val_loss: 0.4933 - val_accuracy: 0.7183\n",
      "Epoch 6/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4880 - accuracy: 0.7378 - val_loss: 0.5009 - val_accuracy: 0.7427\n",
      "Epoch 7/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4840 - accuracy: 0.7371 - val_loss: 0.4938 - val_accuracy: 0.7232\n",
      "Epoch 8/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4766 - accuracy: 0.7450 - val_loss: 0.5047 - val_accuracy: 0.7541\n",
      "Epoch 9/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4706 - accuracy: 0.7447 - val_loss: 0.4979 - val_accuracy: 0.7362\n",
      "Epoch 10/10\n",
      "231/231 [==============================] - 0s 2ms/step - loss: 0.4630 - accuracy: 0.7535 - val_loss: 0.4985 - val_accuracy: 0.7427\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x28c49379c10>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = tf.keras.Sequential([\n",
    "  feature_layer,\n",
    "  layers.Dense(128, activation='relu'),\n",
    "  layers.Dense(128, activation='relu'),\n",
    "  layers.Dropout(.1),\n",
    "  layers.Dense(1)\n",
    "])\n",
    "\n",
    "model.compile(optimizer='adam',\n",
    "              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.fit(train_ds,\n",
    "          validation_data=val_ds,\n",
    "          epochs=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "73/73 [==============================] - 0s 2ms/step - loss: 0.5053 - accuracy: 0.7491\n",
      "Accuracy 0.7491334676742554\n"
     ]
    }
   ],
   "source": [
    "loss, accuracy = model.evaluate(test_ds)\n",
    "print(\"Accuracy\", accuracy)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "关键点：通常使用更大更复杂的数据集进行深度学习，您将看到最佳结果。使用像这样的小数据集时，我们建议使用决策树或随机森林作为强有力的基准。本教程的目的不是训练一个准确的模型，而是演示处理结构化数据的机制，这样，在将来使用自己的数据集时，您有可以使用的代码作为起点。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 参考\n",
    "https://www.tensorflow.org/tutorials/structured_data/feature_columns?hl=zh-cn"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tensorflow",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
